home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1980-01-01 | 9.8 KB | 192 lines |
- 1 REM FILTER PROGRAM V3.1 5/16/83
- 2 PRINT,"modern filter design program":PRINT
- 5 PRINT,"k2uyh ----- modified for ibm pc --- wa2tif":PRINT
- 10 REM PRECISION 5:PRINT:PRINT:PRINT "MODERN FILTER DESIGN PROGRAM":DIM TP(20),C(20),L(20),CP(11,20),LP(11,20),M(20),K(20),E(9),B(10,5),T(7,5,5)
- 20 PRINT: INPUT "LOW PASS (L), HIGH PASS (H), BAND PASS (B)"; Q$
- 25 PI=3.1416
- 30 INPUT "FREQUENCY IN HZ, KHZ OR MHZ"; A$: KF=1: P2=PI*2
- 40 IF A$="KHZ" THEN KF=1000 ELSE IF A$="MHZ" THEN KF=1E+06
- 50 INPUT"IMPEDANCE LEVEL = ";Z0
- 60 IF Q$="L" OR Q$="H" THEN 70 ELSE IF Q$="B" THEN 130 ELSE 20
- 70 PRINT: INPUT "CUT OFF FREQ "; FC: FC=FC*KF
- 80 INPUT "STOP BAND FREQ"; FS: FS=FS*KF
- 90 INPUT "STOP BAND ATTENUATION IN DB"; AS
- 100 IF Q$="L" THEN NS=FS/FC ELSE NS=FC/FS
- 110 PRINT "NORMALIZED CUT OFF FREQ"; NS: GOTO 200
- 120 REM BANDPASS FILTER
- 130 PRINT: INPUT "CENTER FREQUENCY ="; F0: F0=F0*KF: W0=P2*F0
- 140 INPUT "BANDPASS WIDTH ="; FP: FP=FP*KF: WP=P2*FP
- 150 QL=F0/FP: INPUT "START OF STOP BAND ="; FS: FS=FS*KF
- 160 INPUT "STOP BAND ATTENUATION IN DB"; AS
- 170 FD=F0^2/FS: NS=ABS(FS-FD)/FP
- 180 PRINT: PRINT "QL ="; QL, "NORM FREQ RATIO ="; NS
- 190 REM CALC OF # OF POLES
- 200 PRINT: INPUT "BUTTERWORTH (B) OR TCHEBYCHEFF (T)"; B$: N=0
- 210 IF B$="T" THEN 230 ELSE IF B$<>"B" THEN 200
- 220 N=N+1: AT=10*LOG(1+NS^(2*N))/LOG(10): IF AT>AS THEN 260 ELSE 220
- 230 INPUT "RIPPLE IN DB"; RP : TP(0)=1: TP(1)=NS: RE=10^(RP/10)-1
- 240 N=N+1:P=N:IF N>19 THEN GOTO 340 ELSE TP(N+1)=2*NS*TP(N)-TP(N-1)
- 250 AT=10*LOG(1+RE*TP(N+1)^2)/LOG(10): IF AT>AS THEN 260 ELSE 240
- 260 PRINT "NUMBER OF SECTION REQUIRED"; N: P=N
- 270 REM LOAD BUTTERWORTH DATA
- 280 FOR N=1 TO 10: Q=(-1)^N: IF Q<0 THEN AB=INT(N/2)+1 ELSE AB=N/2
- 290 FOR I=1 TO AB: READ B(N,I): NEXT: NEXT
- 300 REM LOAD TCHEBYCHEFF DATA
- 310 FOR R=1 TO 7: FOR N=1 TO 5: FOR I=1 TO N
- 320 READ T(R,N,I): NEXT: NEXT: NEXT
- 330 IF B$="B" THEN 480
- 340 Q=(-1)^P: IF P>10 THEN PRINT "LARGEST VALUE 10": GOTO 20
- 350 IF Q>0 THEN P=P+1: PRINT "MUST USE ODD # FOR BAL TCH: P="; P
- 360 IF RP <=0.01 THEN R=1: RP=0.01: GOTO 440
- 370 IF RP <=0.1 THEN R=2: RP=0.1: GOTO 440
- 380 IF RP <=0.2 THEN R=3: RP=0.2: GOTO 440
- 390 IF RP <=0.5 THEN R=4: RP=0.5: GOTO 440
- 400 IF RP <=1 THEN R=5: RP=1: GOTO 440
- 410 IF RP <=2 THEN R=6: RP=2: GOTO 440
- 420 IF RP <=3 THEN R=7: RP=3: GOTO 440
- 430 PRINT "RIPPLE EXCEEDS MAXIMUN LIMIT": GOTO 20
- 440 PRINT: PRINT "# POLES"; "="; P, "RIPPLE"; "="; RP: PRINT
- 450 N=(P+1)/2: FOR J=1 TO P: IF J<=N THEN I=J ELSE I=P+1-J
- 460 E(J)=T(R,N,I):NEXT:GOTO 520
- 470 REM BUTTERWORTH CALC
- 480 IF P>10 THEN PRINT "LARGEST VALUE 10": GOTO 20
- 490 Q=(-1)^P: IF Q<0 THEN AB=INT(P/2)+1 ELSE AB=P/2
- 500 FOR J=1 TO P: IF J<=AB THEN I=J ELSE I=P+1-J
- 510 E(J)=B(P,I):NEXT
- 520 IF Q$="H" THEN FOR I=1 TO P:E(I)= 1/E(I):NEXT
- 530 N=P:GOTO 730
- 540 DATA 2,1.414,1,2,.765,1.848,.618,1.618,2,.518,1.414,1.932
- 550 DATA .445,1.247,1.802,2,.390,1.111,1.663,1.962,.347,1
- 560 DATA 1.532,1.879,2,.313,.908,1.414,1.782,1.975
- 570 REM DATA FOR TCHEBYCHEFF
- 580 DATA .096,.6291,.9702,.7563,1.3049,1.5773,.7969,1.394
- 590 DATA 1.7481,1.6331,.8144,1.427,1.8043,1.7125,1.9057
- 600 DATA .3052,1.0315,1.1474,1.1468,1.3712,1.9750,1.1811
- 610 DATA 1.4228,2.0966,1.5733,1.1956,1.4425,2.1345,1.6167
- 620 DATA 2.2053,.4342,1.2275,1.1525,1.3394,1.3370,2.1660
- 630 DATA 1.3722,1.3781,2.2756,1.5001,1.386,1.3938,2.3093
- 640 DATA 1.5340,2.3728,.6986,1.5963,1.0967,1.7058,1.2296
- 650 DATA 2.5408,1.7372,1.2583,2.6381,1.3444,1.7504,1.2690
- 660 DATA 2.6678,1.3673,2.7239,1.0177,2.0236,.9941,2.1349
- 670 DATA 1.0911,3.0009,2.1664,1.1116,3.0934,1.1736,2.1797
- 680 DATA 1.1192,3.1215,1.1897,3.1747,1.5296,2.7107,.8327
- 690 DATA 2.8310,.8985,3.7827,2.8655,.9119,3.8780,.9535,2.8790
- 700 DATA .9171,3.9056,.9643,3.9598,1.9953,3.3487,.7117,3.4817
- 710 DATA .7618,4.5381,3.5182,.7723,4.6386,.8039,3.5340,.7760
- 720 DATA 4.6692,.8118,4.7272
- 730 IF Q$="H" THEN 790 ELSE IF Q$="B" THEN 840
- 740 PRINT "LOW PASS (CPLS)"
- 750 FOR I=1 TO N STEP 2:J=I+1:C(I)=E(I)/(P2*FC*Z0):PRINT"C";I;"= ";C(I):IF J<=N THEN L(J)=E(J)*Z0/(P2*FC):PRINT"L";J;"= ";L(J):NEXT
- 760 PRINT "LOW PASS (LSCP)"
- 770 FOR I=1 TO N STEP 2:J=I+1:L(I)=E(I)*Z0/(P2*FC):PRINT"L";I;"= ";L(I):IF J<=N THEN C(J)=E(J)/(P2*FC*Z0):PRINT"C";J;"= ";C(J):NEXT:GOTO 830
- 780 GOTO 830
- 790 PRINT "HIGH PASS (LPCS)"
- 800 FOR I=1 TO N STEP 2:J=I+1:L(I)=E(I)*Z0/(P2*FC):PRINT"L";I;"= ";L(I):IF J<=N THEN C(J)=E(J)/(P2*FC*Z0):PRINT"C";J;"= ";C(J):NEXT
- 810 PRINT "HIGH PASS (CSLP)"
- 820 FOR I=1 TO N STEP 2:J=I+1:C(I)=E(I)/(P2*FC*Z0):PRINT "C";I;"= ";C(I):IF J<=N THEN L(J)=E(J)*Z0/(P2*FC):PRINT "L";J;"= ";L(J):NEXT
- 830 INPUT"WANT TO CALCULATE ANOTHER FILTER Y OR N ";Y$:IF Y$="Y" THEN 20 ELSE GOTO 1870
- 840 PRINT: FOR I=1 TO N
- 850 IF ((-1)^I)<0 THEN C(I)=E(I):CP(1,I)=C(I)/(Z0*FP*P2):LP(1,I)=1/(W0^2*CP(1,I)):GOTO 870
- 860 L(I)=E(I):LP(1,I)=Z0*L(I)/WP:CP(1,I)=1/(W0^2*LP(1,I))
- 870 NEXT
- 880 PRINT: PRINT "ELEMENTS PROTOTYPE #1 (CPLP/CSLS/CPLP)": PRINT: FOR I=1 TO N
- 890 PRINT "C"; I; "="; CP(1,I), "L"; I; "="; LP(1,I): NEXT
- 900 REM CALC MUTUAL INDUCTANCE
- 910 IF L(1)=0 THEN L(1)=C(1): FOR I=1 TO N-1
- 920 IF C(I)=0 THEN C(I)=L(I): L(I+1)=C(I+1)
- 930 M(I)=(L(1)/W0)*SQR(1/(C(I)*L(I+1))): NEXT
- 940 PRINT: INPUT "PROTOTYPE # (2-11) ="; P$
- 950 IF P$="2" THEN 1010
- 960 IF P$="3" THEN 1080
- 970 IF P$="4" THEN 1430
- 980 IF P$="5" THEN 1670
- 990 IF P$="7" THEN 1320
- 1000 IF P$="NEW" THEN 20 ELSE IF P$="END" THEN END ELSE PRINT "DON'T UNDERSTAND ?":GOTO 940
- 1010 PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #2 (CSLS/CPLP/CSLS)"
- 1020 PRINT: FOR I=1 TO N
- 1030 IF ((-1)^I)<0 THEN CP(2,I)=1/(W0*QL*Z0*C(I)): LP(2,I)=Z0*C(I)/WP: PRINT "C"; I; "="; CP(2,I), "L"; I; "="; LP(2,I): GOTO 1050
- 1040 CP(2,I)=L(I)/(Z0*WP): LP(2,I)=Z0/(W0*QL*L(I)): PRINT "C"; I; "="; CP(2,I), "L"; I; "="; LP(2,I)
- 1050 NEXT
- 1060 PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
- 1070 IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 20 ELSE IF Q$="END" THEN END ELSE GOTO 1060
- 1080 PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #3 (CSTCP/TCS/TCP)"
- 1090 PRINT: IF N<3 THEN PRINT "TOO SMALL": GOTO 940
- 1100 CP(3,1)=1/(W0*QL*Z0*C(1)): PRINT "C 1 ="; CP(3,1)
- 1110 LP(3,2)=2*Z0/(W0*QL*L(2)): LP(3,1)=Z0*C(1)/WP+LP(3,2): K(1)=SQR(LP(3,2)/LP(3,1)): CP(3,2)=L(2)/(Z0*WP)
- 1120 PRINT "T 1 : L 1 ="; LP(3,1), "L 2 ="; LP(3,2)
- 1130 PRINT SPC(6); "K 1 ="; K(1), "C 2 ="; CP(3,2)
- 1140 IF N=3 THEN GOTO 1230
- 1150 FOR I=3 TO N-1: IF ((-1)^I)<0 THEN GOTO 1190
- 1160 LP(3,I)=2*Z0/(W0*QL*L(I)): LP(3,I-1)=Z0*C(I-1)/(2*WP)+LP(3,I): K(I-1)=SQR(LP(3,I)/LP(3,I-1)): CP(3,I)=L(I)/(Z0*WP)
- 1170 PRINT "T"; I-1; ": L"; I-1; "="; LP(3,I-1), "L"; I; "="; LP(3,I)
- 1180 PRINT SPC(6); "K"; I-1; "="; K(I-1), "C"; I; "="; CP(3,I): GOTO 1220
- 1190 LP(3,I)=Z0*C(I)/(2*WP)+LP(3,I-1): CP(3,I)=1/(W0*QL*Z0*C(I)): K(I-1)=SQR(LP(3,I-1)/LP(3,I))
- 1200 PRINT "T"; I-1; ": L"; I-1; "="; LP(3,I-1), "L"; I; "="; LP(3,I)
- 1210 PRINT SPC(6); "K"; I-1; "="; K(I-1), "C"; I; "="; CP(3,I)
- 1220 NEXT
- 1230 IF ((-1)^N)<0 THEN GOTO 1270
- 1240 LP(3,N)=Z0/(W0*QL*L(N)): LP(3,N-1)=Z0*C(N-1)/(2*WP)+LP(3,N): K(N-1)=SQR(LP(3,N)/LP(3,N-1)): CP(3,N)=L(N)/(Z0*WP)
- 1250 PRINT "T"; N-1; ": L"; N-1; "="; LP(3,N-1), "L"; N; "="; LP(3,N)
- 1260 PRINT SPC(6); "K"; N-1; "="; K(N-1), "C"; N; "="; CP(3,N): GOTO 1300
- 1270 LP(3,N)=Z0*C(N)/WP+LP(3,N-1): CP(3,N)=1/(W0*QL*Z0*C(N)): K(N-1)=SQR(LP(3,N-1)/LP(3,N))
- 1280 PRINT "T"; N-1; ": L"; N-1; "="; LP(3,N-1), "L"; N; "="; LP(3,N)
- 1290 PRINT SPC(6); "K"; N-1; "="; K(N-1), "C"; N; "="; CP(3,N)
- 1300 PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
- 1310 IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 1080 ELSE IF Q$="END" THEN END ELSE GOTO 1300
- 1320 PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #7 (CPLP/CS/CPLP)"
- 1330 CP(7,1)=L(1)/(Z0*WP)-M(1)/Z0: LP(7,1)=Z0/(W0*QL*L(1))
- 1340 PRINT: PRINT "C 1 ="; CP(7,1), "L 1 ="; LP(7,1): IF N<3 THEN 1380
- 1350 FOR I=2 TO 2*N-4 STEP 2: CP(7,I)=M(I/2)/Z0: PRINT "C"; I; "="; CP(7,I)
- 1360 CP(7,I+1)=L(1)/(Z0*WP)-M(I/2)/Z0-M(I/2+1)/Z0: LP(7,I+1)=LP(7,1)
- 1370 PRINT "C"; I+1; "="; CP(7,I+1), "L"; I+1; "="; LP(7,I+1): NEXT
- 1380 CP(7,2*N-2)=M(N-1)/Z0: CP(7,2*N-1)=L(1)/(Z0*WP)-M(N-1)/Z0: LP(7,2*N-1)=LP(7,1)
- 1390 PRINT "C"; 2*N-2; "="; CP(7,2*N-2)
- 1400 PRINT "C"; 2*N-1; "="; CP(7,2*N-1), "L"; 2*N-1; "="; LP(7,2*N-1)
- 1410 PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
- 1420 IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 1080 ELSE IF Q$="END" THEN END ELSE GOTO 1410
- 1430 PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #4 (CPTCS/TCP/TCS)"
- 1440 PRINT: IF N<3 THEN PRINT "TOO SMALL": GOTO 940
- 1450 CP(4,1)=C(1)/(Z0*WP): PRINT "C 1 ="; CP(4,1)
- 1460 LP(4,1)=Z0/(W0*QL*C(1)): LP(4,2)=Z0*L(2)/(2*WP)+LP(4,1): K(1)=SQR(LP(4,1)/LP(4,2)): CP(4,2)=1/(W0*QL*Z0*L(2))
- 1470 PRINT "T 1 : L 1 ="; LP(4,1), "L 2 ="; LP(4,2)
- 1480 PRINT SPC(6); "K 1 ="; K(1), "C 2 ="; CP(4,2)
- 1490 IF N=3 THEN GOTO 1580
- 1500 FOR I=3 TO N-1: IF ((-1)^I)>0 THEN GOTO 1540
- 1510 LP(4,I)=2*Z0/(W0*QL*C(I)): LP(4,I-1)=Z0*L(I-1)/(2*WP)+LP(4,I): K(I-1)=SQR(LP(4,I-1)/LP(4,I)): CP(4,I)=C(I)/(Z0*WP)
- 1520 PRINT "T"; I-1; ": L"; I-1; "="; LP(4,I-1), "L"; I; "="; LP(4,I)
- 1530 PRINT SPC(6); "K"; I-1; "="; K(I-1), "C"; I; "="; CP(4,I): GOTO 1570
- 1540 LP(4,I)=Z0*L(I)/(2*WP)+LP(4,I-1): CP(4,I)=1/(W0*QL*Z0*L(I)): K(I-1)=SQR(LP(4,I)/LP(4,I-1))
- 1550 PRINT "T"; I-1; ": L"; I-1; "="; LP(4,I-1), "L"; I; "="; LP(4,I)
- 1560 PRINT SPC(6); "K"; I-1; "="; K(I-1), "C"; I; "="; CP(4,I)
- 1570 NEXT
- 1580 IF ((-1)^N)>0 THEN GOTO 1620
- 1590 LP(4,N)=Z0/(W0*QL*C(N)): LP(4,N-1)=Z0*L(N-1)/(2*WP)+LP(4,N): K(N-1)=SQR(LP(4,N)/LP(4,N-1)): CP(4,N)=C(N)/(Z0*WP)
- 1600 PRINT "T"; N-1; ": L"; N-1; "="; LP(4,N-1), "L"; N; "="; LP(4,N)
- 1610 PRINT SPC(6); "K"; N-1; "="; K(N-1), "C"; N; "="; CP(4,N): GOTO 1650
- 1620 LP(4,N)=Z0*L(N)/WP+LP(4,N-1)/2: CP(4,N)=1/(W0*QL*Z0*L(N)): K(N-1)=SQR(LP(4,N-1)/LP(4,N))
- 1630 PRINT "T"; N-1; ": L"; N-1; "="; LP(4,N-1), "L"; N; "="; LP(4,N)
- 1640 PRINT SPC(6); "K"; N-1; "="; K(N-1), "C"; N; "="; CP(4,N)
- 1650 PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
- 1660 IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 1080 ELSE IF Q$="END" THEN END ELSE GOTO 1300
- 1670 PRINT: PRINT "ELEMENT VALUES FOR PROTOTYPE #5 (CST/CST/CST)"
- 1680 PRINT: IF N<2 THEN PRINT "TOO SMALL": GOTO 940
- 1690 CP(5,1)=1/(W0*QL*Z0*L(1)): LP(5,1)=Z0*L(1)/WP
- 1700 CP(5,N)=CP(5,1): LP(5,N)=LP(5,1)
- 1710 PRINT "C 1 ="; CP(5,1)
- 1720 IF N=2 THEN GOTO 1760 ELSE LI=Z0*L(1)/(2*WP): FOR I=2 TO N-1: LP(5,I)=LI
- 1730 IF ((-1)^I)<0 THEN M(I-1)=L(1)*SQR(1/(C(I-1)*L(I)))/W0 ELSE M(I-1)=L(1)*SQR(1/(L(I-1)*C(I)))/W0
- 1740 PRINT "T"; I-1; ":", "L"; I-1; "="; LP(5,I-1), "L"; I; "="; LP(5,I)
- 1750 PRINT "M"; I-1; "="; M(I-1): NEXT
- 1760 IF ((-1)^I)<0 THEN M(N-1)=L(1)*SQR(1/(C(N-1)*L(N)))/W0 ELSE M(N-1)=L(1)*SQR(1/(L(N-1)*C(N)))/W0
- 1770 PRINT "T"; N-1; ":", "L"; N-1; "="; LP(5,N-1), "L"; N; "="; LP(5,N)
- 1780 PRINT "M"; N-1; "="; M(N-1): PRINT "C"; N; "="; CP(5,N)
- 1790 PRINT: INPUT "WANT TO TRY ANOTHER PROTOTYPE (YES, CHANGE, NEW OR END)"; Q$: PRINT
- 1800 IF Q$="YES" THEN 940 ELSE IF Q$="CHANGE" THEN 1810 ELSE IF Q$="NEW" THEN 1080 ELSE IF Q$="END" THEN END ELSE GOTO 1800
- 1810 INPUT "WANT TO CHANGE Z0 (Y/N)"; Q$: IF Q$="Y" THEN INPUT "IMPEDANCE LEVEL ="; Z0
- 1820 INPUT "WANT TO CHANGE BANDPASS"; Q$: IF Q$="Y" THEN INPUT "BANDPASS WIDTH ="; FP: FP=FP*KF: WP=P2*FP
- 1830 PRINT: FOR I=1 TO N
- 1840 IF ((-1)^I)<0 THEN CP(1,I)=C(I)/(Z0*FP*P2): LP(1,I)=1/(W0^2*CP(1,I)): GOTO 1860
- 1850 LP(1,I)=Z0*L(I)/WP: CP(1,I)=1/(W0^2*LP(1,I))
- 1860 NEXT: GOTO 940
- 1870 END
-